#!/bin/bash
set -e
if [ -z "${MountPoint}" ]; then
    # shellcheck source=../common/0_env.sh
    source "../common/0_env.sh"
fi

echo -e "\n***********************************************************************"
echo -e "\t\t$0 : 测试 chown 文件和目录"
echo -e "***********************************************************************"

tmp_dir="/test_chown"
abs_tmp_dir="${MountPoint}${tmp_dir}"
SysUid=`cat /etc/passwd | grep ${SysUser} | awk -F: '{print $3}'`
SysGid=`cat /etc/passwd | grep ${SysUser} | awk -F: '{print $4}'`

function test_no_quota()
{
    echo -e "\n----测试没有配额时 chown ------"
    test_cmd "dd status=none if=/dev/zero of=${abs_tmp_dir}/file bs=100 count=1"
    test_cmd "dd status=none if=/dev/zero of=${abs_tmp_dir}/file2 bs=100 count=1"
    test_cmd "chown "${SysUid}":"${SysGid}" ${abs_tmp_dir}/file "
    test_cmd "chown -R "${SysUid}":"${SysGid}" ${abs_tmp_dir}"
    clean_dir ${abs_tmp_dir}
}

function test_chown_uid_file()
{
    echo -e "\n----测试用户配额: chown file 不超出配额------"
    create_quota ${tmp_dir} "--uid=${SysUid}"
    test_cmd "dd status=none if=/dev/zero of=${abs_tmp_dir}/file bs=100 count=1"

    echo -e "\n\t测试: 把 <非配额uid> 的文件chown为 <非配额uid>"
    test_cmd "chown ${HzzUid}:${HzzGid} ${abs_tmp_dir}/file"
    sleep 1
    check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"
    
    echo -e "\n\t测试: 把 <非配额uid> 的文件chown为 <配额uid>"
    test_cmd "chown ${SysUid}:${SysGid} ${abs_tmp_dir}/file"
    sleep 1
    check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"

    echo -e "\n\t测试: 把 <配额uid> 的文件chown为 <非配额uid>"
    test_cmd "chown ${HzzUid}:${HzzGid} ${abs_tmp_dir}/file"
    sleep 1
    check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"

    echo -e "\n\t测试: 把 <配额uid> 的文件chown为 <配额uid>"
    create_quota ${tmp_dir} "--uid=${HzzUid}"
    test_cmd "chown ${HzzUid}:${HzzGid} ${abs_tmp_dir}/file"
    sleep 1
    check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"
    check_usedsize_and_usednum ${tmp_dir} "--uid=${HzzUid}"

    remove_all_quota_for_dir ${tmp_dir}
    clean_dir ${abs_tmp_dir}
}

function test_chown_dir_with_uid()
{
    echo -e "\n----测试 <用户> 配额: chown dir 不超出配额------"
    test_chown_dir "UID"
}

function test_chown_dir_with_gid()
{
    echo -e "\n----测试 <用户组> 配额: chown dir 不超出配额------"
    test_chown_dir "GID"
}

function test_chown_dir()
{
    if [ "$1"X == "UID"X ]; then
        sysid="--uid=${SysUid}"
        hzzid="--uid=${HzzUid}"
    fi

    if [ "$1"X == "GID"X ]; then
        sysid="--gid=${SysGid}"
        hzzid="--gid=${HzzGid}"
    fi

    abs_sub_dir="${abs_tmp_dir}/subdir"
    create_quota ${tmp_dir} "${sysid}"
    test_cmd "chown -R root:root ${abs_tmp_dir}"
    test_cmd "mkdir -p ${abs_sub_dir}"
    test_cmd "dd status=none if=/dev/zero of=${abs_tmp_dir}/file bs=100 count=1"
    test_cmd "dd status=none if=/dev/zero of=${abs_sub_dir}/subfile bs=100 count=1"
    check_usedsize_and_usednum ${tmp_dir} "${sysid}"

    echo -e "\n\t测试: 把 <非配额uid> 的目录chown为 <非配额uid>"
    test_cmd "chown -R ${HzzUid}:${HzzGid} ${abs_tmp_dir}"
    sleep 1
    check_usedsize_and_usednum ${tmp_dir} "${sysid}"
    
    echo -e "\n\t测试: 把 <非配额uid> 的目录chown为 <配额uid>"
    test_cmd "chown -R ${SysUid}:${SysGid} ${abs_tmp_dir}"
    sleep 1
    check_usedsize_and_usednum ${tmp_dir} "${sysid}"

    echo -e "\n\t测试: 把 <配额uid> 的目录chown为 <非配额uid>"
    test_cmd "chown -R ${HzzUid}:${HzzGid} ${abs_tmp_dir}"
    sleep 1
    check_usedsize_and_usednum ${tmp_dir} "${sysid}"

    echo -e "\n\t测试: 把 <配额uid> 的目录chown为 <配额uid>"
    create_quota ${tmp_dir} "${hzzid}"
    test_cmd "chown -R ${HzzUid}:${HzzGid} ${abs_tmp_dir}"
    sleep 1
    check_usedsize_and_usednum ${tmp_dir} "${sysid}"
    check_usedsize_and_usednum ${tmp_dir} "${hzzid}"

    remove_all_quota_for_dir ${tmp_dir}
    clean_dir ${abs_tmp_dir}
}

function test_chown_dir_with_uid_gid()
{
    echo -e "\n----测试目录同时设置 <用户和用户组> 配额: chown dir 不超出配额------"
    abs_sub_dir="${abs_tmp_dir}/subdir"

    create_quota ${tmp_dir} "--uid=${SysUid}"
    create_quota ${tmp_dir} "--gid=${SysGid}"
    test_cmd "chown -R root:root ${abs_tmp_dir}"
    test_cmd "mkdir -p ${abs_sub_dir}"
    test_cmd "dd status=none if=/dev/zero of=${abs_tmp_dir}/file bs=100 count=1"
    test_cmd "dd status=none if=/dev/zero of=${abs_sub_dir}/subfile bs=100 count=1"
    check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"
    check_usedsize_and_usednum ${tmp_dir} "--gid=${SysGid}"

    echo -e "\n\t测试: 把 <非配额uid> 的目录chown为 <非配额uid>"
    test_cmd "chown -R ${HzzUid}:${HzzGid} ${abs_tmp_dir}"
    sleep 1
    check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"
    check_usedsize_and_usednum ${tmp_dir} "--gid=${SysGid}"
    
    echo -e "\n\t测试: 把 <非配额uid> 的目录chown为 <配额uid>"
    test_cmd "chown -R ${SysUid}:${SysGid} ${abs_tmp_dir}"
    sleep 1
    check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"
    check_usedsize_and_usednum ${tmp_dir} "--gid=${SysGid}"

    echo -e "\n\t测试: 把 <配额uid> 的目录chown为 <非配额uid>"
    test_cmd "chown -R ${HzzUid}:${HzzGid} ${abs_tmp_dir}"
    sleep 1
    check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"
    check_usedsize_and_usednum ${tmp_dir} "--gid=${SysGid}"

    echo -e "\n\t测试: 把 <配额uid> 的目录chown为 <配额uid>"
    create_quota ${tmp_dir} "--uid=${HzzUid}"
    create_quota ${tmp_dir} "--gid=${HzzGid}"
    test_cmd "chown -R ${HzzUid}:${HzzGid} ${abs_tmp_dir}"
    sleep 1
    check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"
    check_usedsize_and_usednum ${tmp_dir} "--gid=${SysGid}"
    check_usedsize_and_usednum ${tmp_dir} "--gid=${HzzUid}"
    check_usedsize_and_usednum ${tmp_dir} "--gid=${HzzGid}"

    remove_all_quota_for_dir ${tmp_dir}
    clean_dir ${abs_tmp_dir}
}

##############
remove_all_quota_for_dir ${tmp_dir}
mkdir -p ${abs_tmp_dir}
clean_dir ${abs_tmp_dir}
orcafs-ctl --setpattern --storagepoolid=2 "${abs_tmp_dir}" &> /dev/null
chmod 0777 ${abs_tmp_dir}

test_no_quota

test_chown_uid_file # 测试 chown file 没有超出 uid配额
test_chown_dir_with_uid  # 测试 chown -R dir 没有超出 uid目录配额 阈值
test_chown_dir_with_gid  # 测试 chown -R dir 没有超出 gid目录配额 阈值
test_chown_dir_with_uid_gid # 测试目录同时设置了 uid 和 gid 配额，chown -R dir 没有超出配额
rm_abs_dir ${abs_tmp_dir}

# 1. chown file 更新文件个数用量,文件移出，文件移入
    # olduid 属于当前配额，当前配额用量减少
    # newuid 属于当前配额，当前配额增加
# 2. chown 子目录
    # -R
    # 没有 -R
# 3. chown 配额目录
    # -R
    # 没有 -R


